@@ -182,12 +182,18 @@ class TourGuideInfo(CreateUpdateMixin): |
||
| 182 | 182 |
return unicode(self.pk) |
| 183 | 183 |
|
| 184 | 184 |
@property |
| 185 |
+ def photo_url(self): |
|
| 186 |
+ return '' |
|
| 187 |
+ |
|
| 188 |
+ @property |
|
| 185 | 189 |
def data(self): |
| 186 | 190 |
return {
|
| 187 | 191 |
'name': self.name, |
| 188 | 192 |
'sex': self.sex, |
| 189 | 193 |
'phone': self.phone, |
| 190 | 194 |
'location': self.location, |
| 195 |
+ 'no': self.no, |
|
| 196 |
+ 'photo': self.photo_url, |
|
| 191 | 197 |
'status': self.user_status, |
| 192 | 198 |
'refused_reason': self.refused_reason, |
| 193 | 199 |
} |
@@ -21,6 +21,10 @@ def tourguide_submit_api(request): |
||
| 21 | 21 |
openid = request.POST.get('openid', '')
|
| 22 | 22 |
phone = request.POST.get('phone', '')
|
| 23 | 23 |
|
| 24 |
+ serverIds = request.POST.getlist('serverIds[]', [])
|
|
| 25 |
+ |
|
| 26 |
+ # TODO: get tour guide photo from wx server |
|
| 27 |
+ |
|
| 24 | 28 |
if TourGuideInfo.objects.filter(phone=phone).exclude(unionid=unionid).exists(): |
| 25 | 29 |
return response(TourGuideStatusCode.TOURGUIDE_PHONE_ALREADY_EXISTS) |
| 26 | 30 |
|
@@ -18,6 +18,10 @@ |
||
| 18 | 18 |
input:required:valid {
|
| 19 | 19 |
color: rgb(0, 0, 0); |
| 20 | 20 |
} |
| 21 |
+ #tour_guide_photo {
|
|
| 22 |
+ width: 60%; |
|
| 23 |
+ margin-left: 20%; |
|
| 24 |
+ } |
|
| 21 | 25 |
</style> |
| 22 | 26 |
</head> |
| 23 | 27 |
<body> |
@@ -57,6 +61,39 @@ |
||
| 57 | 61 |
<input id="no" class="weui_input" type="text" required="required" value="{{ tourguide_info.no }}" placeholder="请输入导游证编号" {% if not modified %}disabled{% endif %}>
|
| 58 | 62 |
</div> |
| 59 | 63 |
</div> |
| 64 |
+ |
|
| 65 |
+ <div class="weui_cell"> |
|
| 66 |
+ <div class="weui_cell_bd weui_cell_primary"> |
|
| 67 |
+ <div class="weui_uploader"> |
|
| 68 |
+ <div class="weui_uploader_hd weui_cell"> |
|
| 69 |
+ <div class="weui_cell_bd weui_cell_primary">导游证照片</div> |
|
| 70 |
+{# <div class="weui_cell_ft">0/2</div>#}
|
|
| 71 |
+ </div> |
|
| 72 |
+ <div class="weui_uploader_bd"> |
|
| 73 |
+ <img id="tour_guide_photo" src="{{ tourguide_info.photo_url }}">
|
|
| 74 |
+{# <ul class="weui_uploader_files">#}
|
|
| 75 |
+{# <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
|
|
| 76 |
+{# <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
|
|
| 77 |
+{# <li class="weui_uploader_file" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)"></li>#}
|
|
| 78 |
+{# <li class="weui_uploader_file weui_uploader_status" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)">#}
|
|
| 79 |
+{# <div class="weui_uploader_status_content">#}
|
|
| 80 |
+{# <i class="weui_icon_warn"></i>#}
|
|
| 81 |
+{# </div>#}
|
|
| 82 |
+{# </li>#}
|
|
| 83 |
+{# <li class="weui_uploader_file weui_uploader_status" style="background-image:url(http://shp.qpic.cn/weixinsrc_pic/pScBR7sbqjOBJomcuvVJ6iacVrbMJaoJZkFUIq4nzQZUIqzTKziam7ibg/)">#}
|
|
| 84 |
+{# <div class="weui_uploader_status_content">50%</div>#}
|
|
| 85 |
+{# </li>#}
|
|
| 86 |
+{# </ul>#}
|
|
| 87 |
+ {% if modified %}
|
|
| 88 |
+ <div class="weui_uploader_input_wrp"> |
|
| 89 |
+{# <input class="weui_uploader_input" type="file" accept="image/*" multiple="">#}
|
|
| 90 |
+ </div> |
|
| 91 |
+ {% endif %}
|
|
| 92 |
+ </div> |
|
| 93 |
+ </div> |
|
| 94 |
+ </div> |
|
| 95 |
+ </div> |
|
| 96 |
+ |
|
| 60 | 97 |
</div> |
| 61 | 98 |
|
| 62 | 99 |
{% if tourguide_info %}
|
@@ -113,7 +150,9 @@ |
||
| 113 | 150 |
</div> |
| 114 | 151 |
</div> |
| 115 | 152 |
|
| 116 |
- <script src="//cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script> |
|
| 153 |
+ <script type="text/javascript" src="http://cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script> |
|
| 154 |
+ <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> |
|
| 155 |
+ <script type="text/javascript" src="{% static 'pai2/js/jswe.js' %}?v=15"></script>
|
|
| 117 | 156 |
<script> |
| 118 | 157 |
{% if modified %}
|
| 119 | 158 |
$(function() {
|
@@ -158,6 +197,18 @@ |
||
| 158 | 197 |
return false; |
| 159 | 198 |
} |
| 160 | 199 |
|
| 200 |
+ var localIds = V.images.localIds; |
|
| 201 |
+ if (localIds.length == 0) {
|
|
| 202 |
+ show_error_dialog('照片', '请上传导游证照片');
|
|
| 203 |
+ return false; |
|
| 204 |
+ } |
|
| 205 |
+ |
|
| 206 |
+ var serverIds = V.images.serverIds; |
|
| 207 |
+ if (serverIds.length == 0) {
|
|
| 208 |
+ show_error_dialog('网络异常', '请稍后重试');
|
|
| 209 |
+ return false; |
|
| 210 |
+ } |
|
| 211 |
+ |
|
| 161 | 212 |
return {
|
| 162 | 213 |
unionid: unionid, |
| 163 | 214 |
openid: getURLParameter('openid'),
|
@@ -166,6 +217,7 @@ |
||
| 166 | 217 |
phone: $('#phone').val(),
|
| 167 | 218 |
{# location: location,#}
|
| 168 | 219 |
no: no, |
| 220 |
+ serverIds: serverIds, |
|
| 169 | 221 |
} |
| 170 | 222 |
} |
| 171 | 223 |
|
@@ -193,13 +245,14 @@ |
||
| 193 | 245 |
|
| 194 | 246 |
$('#dialog .weui_btn_dialog').click(function () {
|
| 195 | 247 |
$('#dialog').hide();
|
| 196 |
- }) |
|
| 248 |
+ }); |
|
| 197 | 249 |
}); |
| 198 | 250 |
{% endif %}
|
| 199 | 251 |
</script> |
| 200 |
- <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> |
|
| 201 |
- <script type="text/javascript" src="{% static 'pai2/js/jswe.js' %}?v=1"></script>
|
|
| 202 | 252 |
<script> |
| 253 |
+ V.wxChooseImageSuccess = function (res) {
|
|
| 254 |
+ $('#tour_guide_photo')[0].src = V.images.localIds[0];
|
|
| 255 |
+ } |
|
| 203 | 256 |
V.initWxData({
|
| 204 | 257 |
imgUrl: "http://pai.ai/static/pai2/img/paiai_96_96.png", |
| 205 | 258 |
link: 'http://api.pai.ai/wx_oauth2?redirect_url=http://pai.ai/page/tourguide&scope=snsapi_base', |
@@ -208,6 +261,9 @@ |
||
| 208 | 261 |
timeLine: "" |
| 209 | 262 |
}, true); |
| 210 | 263 |
V.hideOptionMenu(); |
| 264 |
+ $('.weui_uploader_input_wrp').click(function () {
|
|
| 265 |
+ V.chooseImage(1, true); |
|
| 266 |
+ }) |
|
| 211 | 267 |
</script> |
| 212 | 268 |
</body> |
| 213 | 269 |
</html> |
@@ -43,6 +43,7 @@ |
||
| 43 | 43 |
'closeWindow', |
| 44 | 44 |
'scanQRCode', |
| 45 | 45 |
'chooseWXPay', |
| 46 |
+ 'openEnterpriseRedPacket', |
|
| 46 | 47 |
'openProductSpecificView', |
| 47 | 48 |
'addCard', |
| 48 | 49 |
'chooseCard', |
@@ -100,19 +101,19 @@ |
||
| 100 | 101 |
var callbacks = {
|
| 101 | 102 |
trigger: function (res) {
|
| 102 | 103 |
// alert('用户点击发送给朋友')
|
| 103 |
- if (JSWE.wxTrigger) {JSWE.wxTrigger()}
|
|
| 104 |
+ if (JSWE.wxTrigger) {JSWE.wxTrigger(res)}
|
|
| 104 | 105 |
}, |
| 105 | 106 |
success: function (res) {
|
| 106 | 107 |
// alert('已分享')
|
| 107 |
- if (JSWE.wxSuccess) {JSWE.wxSuccess()}
|
|
| 108 |
+ if (JSWE.wxSuccess) {JSWE.wxSuccess(res)}
|
|
| 108 | 109 |
}, |
| 109 | 110 |
cancel: function (res) {
|
| 110 | 111 |
// alert('已取消')
|
| 111 |
- if (JSWE.wxCancel) {JSWE.wxCancel()}
|
|
| 112 |
+ if (JSWE.wxCancel) {JSWE.wxCancel(res)}
|
|
| 112 | 113 |
}, |
| 113 | 114 |
fail: function (res) {
|
| 114 | 115 |
// alert(JSON.stringify(res)) |
| 115 |
- if (JSWE.wxFail) {JSWE.wxFail()}
|
|
| 116 |
+ if (JSWE.wxFail) {JSWE.wxFail(res)}
|
|
| 116 | 117 |
} |
| 117 | 118 |
}, shareInfo = function(flag) {
|
| 118 | 119 |
var _share = {
|
@@ -126,7 +127,7 @@ |
||
| 126 | 127 |
} |
| 127 | 128 |
if (flag) _share.desc = wxData.desc |
| 128 | 129 |
return _share |
| 129 |
- }, wxApi = function() {
|
|
| 130 |
+ }, wxShareApi = function() {
|
|
| 130 | 131 |
// 2. 分享接口 |
| 131 | 132 |
// 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口 |
| 132 | 133 |
wx.onMenuShareAppMessage(shareInfo(1)) |
@@ -136,12 +137,16 @@ |
||
| 136 | 137 |
wx.onMenuShareQQ(shareInfo(1)) |
| 137 | 138 |
// 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口 |
| 138 | 139 |
wx.onMenuShareWeibo(shareInfo(1)) |
| 139 |
- // 8 界面操作接口 |
|
| 140 |
+ }, wxMenuApi = function () {
|
|
| 141 |
+ // 8. 界面操作接口 |
|
| 140 | 142 |
// 8.1 隐藏右上角菜单 |
| 141 | 143 |
// 8.2 显示右上角菜单 |
| 142 | 144 |
if (wxConfig.hide) {wx.hideOptionMenu()} else {wx.showOptionMenu()}
|
| 143 | 145 |
// 8.7 关闭当前窗口 |
| 144 | 146 |
if (wxConfig.close) {wx.closeWindow()}
|
| 147 |
+ }, wxApi = function () {
|
|
| 148 |
+ wxShareApi() |
|
| 149 |
+ wxMenuApi() |
|
| 145 | 150 |
} |
| 146 | 151 |
|
| 147 | 152 |
wx.ready(wxApi) |
@@ -177,6 +182,85 @@ |
||
| 177 | 182 |
if ('undefined' !== typeof wxApiFun) wxApiFun()
|
| 178 | 183 |
} |
| 179 | 184 |
|
| 185 |
+ // 5 图片接口 |
|
| 186 |
+ // 5.1 拍照、本地选图 |
|
| 187 |
+ var images = {
|
|
| 188 |
+ localIds: [], |
|
| 189 |
+ serverIds: [] |
|
| 190 |
+ }; |
|
| 191 |
+ function chooseImage(count, directUpload, isShowProgressTips) {
|
|
| 192 |
+ if ('undefined' === typeof count) {count = 9}
|
|
| 193 |
+ if ('undefined' === typeof directUpload) {directUpload = false}
|
|
| 194 |
+ if ('undefined' === typeof isShowProgressTips) {isShowProgressTips = 1}
|
|
| 195 |
+ wx.chooseImage({
|
|
| 196 |
+ count: count, // 默认9 |
|
| 197 |
+ sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 |
|
| 198 |
+ sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 |
|
| 199 |
+ success: function (res) {
|
|
| 200 |
+ var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 |
|
| 201 |
+ images.localIds = localIds; |
|
| 202 |
+ // 判断是否直接上传 |
|
| 203 |
+ if (directUpload) {setTimeout(uploadImages(localIds, isShowProgressTips), 100)}
|
|
| 204 |
+ // 拍照、本地选图成功后的回调函数 |
|
| 205 |
+ if (JSWE.wxChooseImageSuccess) {JSWE.wxChooseImageSuccess(res)}
|
|
| 206 |
+ } |
|
| 207 |
+ }); |
|
| 208 |
+ } |
|
| 209 |
+ |
|
| 210 |
+ // 5.3 上传图片 |
|
| 211 |
+ function uploadImage(localId, isShowProgressTips) {
|
|
| 212 |
+ // 上传图片为异步处理,重复上传同一图片,返回的serverId也是不同的 |
|
| 213 |
+ wx.uploadImage({
|
|
| 214 |
+ localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得 |
|
| 215 |
+ isShowProgressTips: 1, // 默认为1,显示进度提示 |
|
| 216 |
+ success: function (res) {
|
|
| 217 |
+ var serverId = res.serverId; // 返回图片的服务器端ID |
|
| 218 |
+ images.serverIds.push(serverId); |
|
| 219 |
+ // 上传图片成功后的回调函数 |
|
| 220 |
+ if (JSWE.wxUploadImageSuccess) {JSWE.wxUploadImageSuccess(res)}
|
|
| 221 |
+ } |
|
| 222 |
+ }); |
|
| 223 |
+ } |
|
| 224 |
+ |
|
| 225 |
+ function uploadImages(localIds, isShowProgressTips) {
|
|
| 226 |
+ if ('undefined' === typeof localIds) {localIds = images.localIds}
|
|
| 227 |
+ if ('undefined' === typeof isShowProgressTips) {isShowProgressTips = 1}
|
|
| 228 |
+ images.serverIds = []; |
|
| 229 |
+ for (var index in localIds) {uploadImage(localIds[index], isShowProgressTips)}
|
|
| 230 |
+ } |
|
| 231 |
+ |
|
| 232 |
+ // 10 微信支付接口 |
|
| 233 |
+ // 10.1 发起一个支付请求 |
|
| 234 |
+ function chooseWXPay(wxpay_params) {
|
|
| 235 |
+ wx.chooseWXPay({
|
|
| 236 |
+ timestamp: wxpay_params.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 |
|
| 237 |
+ nonceStr: wxpay_params.nonceStr, // 支付签名随机串,不长于 32 位 |
|
| 238 |
+ package: wxpay_params.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) |
|
| 239 |
+ signType: wxpay_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' |
|
| 240 |
+ paySign: wxpay_params.paySign, // 支付签名 |
|
| 241 |
+ success: function (res) {
|
|
| 242 |
+ // 支付成功后的回调函数 |
|
| 243 |
+ if (JSWE.wxPaySuccess) {JSWE.wxPaySuccess(res)}
|
|
| 244 |
+ } |
|
| 245 |
+ }) |
|
| 246 |
+ } |
|
| 247 |
+ |
|
| 248 |
+ // xx 微信原生企业红包接口 |
|
| 249 |
+ // xx.1 发起一个发送原生企业红包请求 |
|
| 250 |
+ function openEnterpriseRedPacket(wxredpack_params) {
|
|
| 251 |
+ wx.openEnterpriseRedPacket({
|
|
| 252 |
+ timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 |
|
| 253 |
+ nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位 |
|
| 254 |
+ package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***) |
|
| 255 |
+ signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' |
|
| 256 |
+ paySign: wxredpack_params.paySign, // 红包签名 |
|
| 257 |
+ success: function (res) {
|
|
| 258 |
+ // 发送原生企业红包成功后的回调函数 |
|
| 259 |
+ if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
|
|
| 260 |
+ } |
|
| 261 |
+ }) |
|
| 262 |
+ } |
|
| 263 |
+ |
|
| 180 | 264 |
var v = {
|
| 181 | 265 |
version: '1.0.5', |
| 182 | 266 |
|
@@ -198,7 +282,19 @@ |
||
| 198 | 282 |
// Share Function |
| 199 | 283 |
initWxData: initWxData, |
| 200 | 284 |
changeWxData: changeWxData, |
| 201 |
- fixedWxData: fixedWxData |
|
| 285 |
+ fixedWxData: fixedWxData, |
|
| 286 |
+ |
|
| 287 |
+ // Image Function |
|
| 288 |
+ images: images, |
|
| 289 |
+ chooseImage: chooseImage, |
|
| 290 |
+ uploadImage: uploadImage, |
|
| 291 |
+ uploadImages: uploadImages, |
|
| 292 |
+ |
|
| 293 |
+ // Pay Function |
|
| 294 |
+ chooseWXPay: chooseWXPay, |
|
| 295 |
+ |
|
| 296 |
+ // EnterpriseRedPacket Function |
|
| 297 |
+ openEnterpriseRedPacket: openEnterpriseRedPacket |
|
| 202 | 298 |
} |
| 203 | 299 |
e.JSWE = e.V = v |
| 204 |
-})(window) |
|
| 300 |
+})(window) |